import javax.swing.tree.TreeNode;

//leetcode_104:二叉树的最大深度
//给定一个二叉树，找出其最大深度。
//二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
public class leetcode_104 {
    //方法一：深度优先搜索
//    如果我们知道了左子树和右子树的最大深度 l 和 r，那么该二叉树的最大深度即为
//     max(l,r) + 1
//    而左子树和右子树的最大深度又可以以同样的方式进行计算。
//    因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言，在计算当前二叉树的最大深度时，
//    可以先递归计算出其左子树和右子树的最大深度，然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            int leftHeight = maxDepth(root.left);
            int rightHeight = maxDepth(root.right);
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }
//    复杂度分析
//    时间复杂度：O(n)，其中 nn 为二叉树节点的个数。每个节点在递归中只被遍历一次。
//    空间复杂度：O(height)，其中height 表示二叉树的高度。递归函数需要栈空间，
//    而栈空间取决于递归的深度，因此空间复杂度等价于二叉树的高度。
      public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x) { val = x; }
  }

}
